package org.water.common.db;

import org.water.common.param.AppSysParam;
import org.water.common.param.ConstParams;

/**
 * 数据库匹配器  用于写sql语句时动态匹配
 * @author qinzhengyong
 *
 */
public class DbAdapter 
{
	/**
	 * 模糊匹配
	 * @param param 变量名称，如 name
	 * @return
	 */
	public static String like(String parameter)
	{
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL))
		{
			str=" concat('%',"+parameter+",'%') ";
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str=" '%'||"+parameter+"||'%' ";
		}
		return str;
	}
	/**
	 * 拼接字符串 对应mysql:concat,oracle:||
	 * @param strings 动态字符串数组
	 * @return
	 */
	public static String concat(String...strings){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			for(String s:strings){
				str="".equalsIgnoreCase(str)?s:(str+","+s);
			}
			str=" concat("+str+") ";
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			for(String s:strings){
				str="".equalsIgnoreCase(str)?s:(str+"||"+s);
			}
		}
		return str;
	}
	/**
	 * 分组聚合拼接字符串函数，对应mysql: group_concat,oracle:wm_concat
	 * @param parameter 分组字段
	 * @return
	 */
	public static String groupConcat(String parameter){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			str=" group_concat("+parameter+") ";
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str=" wm_concat("+parameter+") ";
		}
		return str;
	}
	/***
	 * 判断为空，替换为指定的表达式 对应MYSQL:ifnull,ORACLE:nvl
	 * @param parameter 原表达式参数
	 * @param expr 替换的表达式
	 * @return
	 */
	public static String ifnull(String parameter,String expr){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			str=" ifnull("+parameter+","+expr+") ";  
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str=" nvl("+parameter+","+expr+") ";
		}
		return str;
	}
	/***
	 * 判断为空，查找指定的值是否存在对应mysql :find_in_set，oracle: instr( ','||strlist||',',','||str||',')>0
	 * @param str 原表达式参数 指定的值表达式
	 * @param strlist 查找列表值的表达式
	 * @return
	 */
	public static String findInSet(String str,String strlist){
		String result="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			result=" find_in_set("+str+","+strlist+") ";  
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			result=" instr( ','||"+strlist+"||',',','||"+str+"||',')>0 ";
		}
		return result;
	}
	/**
	 * 日期格式化参数,对应MYSQL:date_format(date,'%Y%-%m-%d %H:%i:%s'),ORACLE:  to_char(date,'YYYY-MM-DD HH24:MI:SS')
	 * @param parameter
	 * @return
	 */
	public static String datetimeFormat(String parameter){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			str=" date_format("+parameter+",'%Y%-%m-%d %H:%i:%s') ";  
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str=" to_char("+parameter+",'YYYY-MM-DD HH24:MI:SS') ";  
		}
		return str;
	}
	/**
	 * 日期格式化参数，对应MYSQL:date_format(date,'%Y%-%m-%d'),ORACLE:to_char(date,'YYYY-MM-DD')
	 * @param parameter
	 * @return
	 */
	public static String dateFormat(String parameter){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			str=" date_format("+parameter+",'%Y%-%m-%d') ";  
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str=" to_char("+parameter+",'YYYY-MM-DD') ";  
		}
		return str;
	}
	/**
	 * 转换为字符串，MYSQL:cast(str as CHAR) ,ORACLE:to_char(str) 
	 * @param parameter
	 * @return
	 */
	public static String toChar(String parameter){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			str=" cast("+parameter+" as CHAR) ";  
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str=" to_char("+parameter+") ";
			
		}
		return str;
	}
	/**
	 * 结果集分页，mysql对应limit,oracle对应rownum取值
	 * @param sql
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	public static String page(String sql,String pageIndex,String pageSize){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL ))
		{
			str+=sql+" limit "+((Integer.valueOf(pageIndex)-1)*Integer.valueOf(pageSize))+","+pageSize;
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			StringBuffer pageBuf = new StringBuffer();
			pageBuf.append("select   * from ( select row_limit.*, rownum rownum_ from (");
			pageBuf.append(sql);
			pageBuf.append(" ) row_limit where rownum <= "+Integer.valueOf(pageIndex)*Integer.valueOf(pageSize));
			pageBuf.append(" ) where rownum_ >"+(Integer.valueOf(pageIndex)-1)*Integer.valueOf(pageSize));
			str=pageBuf.toString(); 
		}
		return str;
	}
	/**
	 * between日期 格式化
	 * @param startDate 开始时间
	 * @param endDate 结束时间
	 * @return
	 */
	public static String betweenDate(String startDate,String endDate){
		String str="";
		if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.MYSQL) ){
			str= startDate+" and concat("+endDate+",' 23:59:59' )";
		}
		else if(AppSysParam.DB_TYPE.equalsIgnoreCase(ConstParams.ORACLE))
		{
			str= "to_date("+startDate+",'YYYY-MM-DD') and to_date(concat("+endDate+",' 23:59:59' ),'YYYY-MM-DD HH24:MI:SS')";
		}
		return str;
	}
	
}
